package cn.mikeal.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.HashSet;
import java.util.Locale;
import java.util.Set;

import cn.mikeal.bean.WebLogBean;

public class WebLogParseUtils {
	private static SimpleDateFormat df1 = new SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss", Locale.US);
	private static SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
	private static Set<String> pages = new HashSet<>();

	static {
		pages.add("/about");
		pages.add("/black-ip-list/");
		pages.add("/cassandra-clustor/");
		pages.add("/finance-rhive-repurchase/");
		pages.add("/hadoop-family-roadmap/");
		pages.add("/hadoop-hive-intro/");
		pages.add("/hadoop-zookeeper-intro/");
		pages.add("/hadoop-mahout-roadmap/");
	}

	/*
	 * 将nginx获取的日志数据提取基础表需求字段 对应的实体类为WebLogBean
	 */
	public static WebLogBean parse(String line) throws ParseException {
		String[] log_datas = line.split(" ");
		if (log_datas.length >= 12) {
			String remote_addr = log_datas[0];
			String remote_user = log_datas[1];
			String local_time = log_datas[3];
			String format_time = "";
			// 判断如果时间戳存在，进行时间转换
			if (local_time.length() >= 3) {
				local_time = local_time.substring(1, local_time.length() - 1);
				format_time = df2.format(df1.parse(local_time));
			}
			if (null == format_time || "".equals(format_time)) { // 判断是否是无效字符
				format_time = "_invalid_";
			}
			// 获取请求类型
			String request = log_datas[6];
			// 获取响应码
			String status = log_datas[8];
			// 获取文本字节
			String body_bytes_sent = log_datas[9];
			// 获取外链
			String http_referer = log_datas[10];

			// 拼接浏览器信息
			StringBuffer sb = new StringBuffer();
			for (int i = 11; i < log_datas.length; i++) {
				sb.append(log_datas[i] + " ");
			}
			// 获取浏览器信息
			String http_user_agent = sb.substring(1, sb.length() - 2);
			// 封装对象,默认数据不合法
			WebLogBean bean = new WebLogBean(false, remote_user, remote_addr, format_time, request, status,
					body_bytes_sent, http_referer, http_user_agent);
			// 判断数据的有效性
			if ("_invalid_".equals(format_time)) {
				bean.setIs_valid(false);
			}
			if (Integer.parseInt(bean.getStatus()) > 404) {
				bean.setIs_valid(false);
			}
			/*
			 * 静态资源的请求无效 1.正则表达式过滤 2.需要分析的获取
			 */
			if (pages.contains(bean.getRequest())) {
				bean.setIs_valid(true);
			}
			return bean;
		} else {
			return null;
		}

	}

}
